package com.elysium.sms;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Random;

@Service
public class AliyunSmsService {

    private String signNam = "飞驰专车"; // 阿里云短信签名
    private String templateCod = "SMS_471370043"; // 阿里云短信模板代码
    private String accessKeyId = "LTAI5tSXFsQQue7Jj5bHyj3B"; // 阿里云Access Key ID
    private String accessKeySecret = "4Om7gdrNbpYrJxue3rRmah0Xb8cZQ3"; // 阿里云Access Key Secret

    /**
     * 发送短信
     *
     * @param mobile 手机号码
     * @return 是否发送成功
     * @throws UnsupportedEncodingException 不支持的编码异常
     */
    public boolean send(String mobile) throws UnsupportedEncodingException {
        // 创建一个DefaultProfile实例，使用阿里云的区域、AccessKey ID和AccessKey Secret进行身份验证
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);

        // 创建一个IAcsClient实例，用于发送短信
        IAcsClient client = new DefaultAcsClient(profile);

        // 创建SendSmsRequest实例，用于发送短信请求
        SendSmsRequest request = new SendSmsRequest();

        // 设置要发送短信的手机号码
        request.setPhoneNumbers(mobile);

        // 设置短信签名，使用URL解码以确保字符编码正确
        request.setSignName(URLDecoder.decode(signNam, "UTF-8"));

        // 设置短信模板代码，从而使用预定义的短信内容
        request.setTemplateCode(templateCod);
        // 随机生成一个6位数的验证码
        String authCode = generateAuthCode(6); // 生成一个6位数的验证码
        // 可以设置短信模板的参数（假设使用了参数化模板）
        String templateParam = String.format("{\"code\":\"%s\"}", authCode);
        // 使用 String.format 来格式化字符串
        request.setTemplateParam(templateParam);

        try {
            // 发送请求并获取响应
            SendSmsResponse response = client.getAcsResponse(request);
            System.out.println("返回状态码: " + response.getCode());

            // 返回是否发送成功，判断返回码是否为"OK"
            return "OK".equals(response.getCode());
        } catch (ClientException e) {
            e.printStackTrace();
        }
        // 默认返回true，表示短信发送请求已发送
        return true;
    }

    // 传入需要生成的随机数长度，返回一个规定长度的随机数
    public static String generateAuthCode(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            sb.append(random.nextInt(10)); // 生成0到9之间的随机数
        }
        return sb.toString();
    }

}
